package com.solo.system.service.impl;

import cn.hutool.core.util.NumberUtil;
import com.mybatisflex.core.update.UpdateChain;
import com.solo.common.core.base.service.impl.BasicServiceImpl;
import com.solo.common.core.utils.NumberUtils;
import com.solo.system.api.entity.SysI18nData;
import com.solo.system.api.entity.SysI18nTypeData;
import com.solo.system.mapper.SysI18nDataMapper;
import com.solo.system.mapper.SysI18nTypeDataMapper;
import com.solo.system.model.i18n.data.SysI18nDataConvert;
import com.solo.system.model.i18n.data.req.I18nDataCreateReq;
import com.solo.system.model.i18n.data.req.I18nDataUpdateReq;
import com.solo.system.model.i18n.type.SysI18nTypeDataConvert;
import com.solo.system.service.SysI18nDataService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.List;
import java.util.Objects;

import static com.solo.common.core.utils.ServiceExceptionUtil.exception;
import static com.solo.system.api.consts.SystemCode.I18N_DATA_KEY_EXISTS;
import static com.solo.system.api.entity.table.SysI18nTypeDataTableDef.SysI18nTypeDataTable;

/**
 * 国际化语言数据 Service实现类
 * @author 十一
 * @since 2024-10-24 13:46
 * 人生若只如初见，何事秋风悲画扇
 **/
@Service
@RequiredArgsConstructor
public class SysI18nDataServiceImpl extends BasicServiceImpl<SysI18nDataMapper, SysI18nData> implements SysI18nDataService {

    private final SysI18nDataMapper sysI18nDataMapper;
    private final SysI18nTypeDataMapper sysI18nTypeDataMapper;
    
    @Override
    @Transactional
    public boolean create(I18nDataCreateReq req) {
        // 验证i18n Key是否唯一
        validateKeyUnique(req.getKey(), null);
        
        SysI18nData entity = SysI18nDataConvert.INSTANCE.convert(req);
        // 保存国际化语言数据
        int insert = mapper.insert(entity);
        boolean result = NumberUtils.isPositiveInteger(insert);
        if (result) {
            // 插入译文
            List<SysI18nTypeData> typeDataList = SysI18nTypeDataConvert.INSTANCE.convert(req.getTranslates(), entity.getDataId());
            sysI18nTypeDataMapper.insertBatch(typeDataList);
        }
        return result;
    }

    @Override
    public boolean update(I18nDataUpdateReq req) {
        SysI18nData entity = SysI18nDataConvert.INSTANCE.convert(req);
        // 验证i18n Key是否唯一
        validateKeyUnique(entity.getKey(), entity.getDataId());
        // 更新国际化语言数据
        int update = mapper.update(entity);
        boolean result = NumberUtils.isPositiveInteger(update);
        if (result) {
            // 更新译文
            UpdateChain.of(SysI18nTypeData.class)
                    .where(SysI18nTypeDataTable.DataId.eq(req.getDataId()))
                    .remove();
            List<SysI18nTypeData> typeDataList = SysI18nTypeDataConvert.INSTANCE.convert(req.getTranslates(), entity.getDataId());
            sysI18nTypeDataMapper.insertBatch(typeDataList);
        }
        return result;
    }

    @Override
    public boolean delete(Collection<Long> dataIds) {
        int delete = mapper.deleteBatchByIds(dataIds);
        boolean result = NumberUtils.isPositiveInteger(delete);
        if (result) {
            sysI18nTypeDataMapper.deleteByDataIds(dataIds);
        }
        return result;
    }

    /**
     * 验证i18n Key是否唯一
     * @param key 键
     * @param dataId 数据id
     */
    void validateKeyUnique(String key, Long dataId) {
        SysI18nData i18nData = sysI18nDataMapper.selectByKey(key);
        if (Objects.isNull(i18nData)) {
            return;
        }
        if (!NumberUtil.equals(i18nData.getDataId(), dataId)) {
            throw exception(I18N_DATA_KEY_EXISTS, key);
        }
    }
    
}
